/**
 * 
 */
package fr.gfi.agraf.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import fr.gfi.agraf.persistence.dao.IActiviteDAO;
import fr.gfi.agraf.persistence.dao.IEtatDAO;
import fr.gfi.agraf.persistence.dao.ITacheDAO;
import fr.gfi.agraf.persistence.dao.IUtilisateurDAO;
import fr.gfi.agraf.persistence.entity.Activite;
import fr.gfi.agraf.persistence.entity.Tache;
import fr.gfi.agraf.service.ITacheService;
import fr.gfi.agraf.service.enumeration.EtatEnum;
import fr.gfi.agraf.service.mapper.TacheMapper;
import fr.gfi.agraf.vue.bean.TacheDTO;

/**
 * @author Fw
 * 
 */
@Service("TacheService")
@Transactional(propagation = Propagation.REQUIRED)
public class TacheService implements ITacheService {

	@Autowired
	private ITacheDAO tacheDAO;

	@Autowired
	private IActiviteDAO activiteDAO;

	@Autowired
	private IUtilisateurDAO utilisateurDAO;

	@Autowired
	private IEtatDAO etatDAO;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.service.ITacheService#getListeTacheByActiviteAndUtilisateur
	 * (java.lang.Long, java.lang.Long)
	 */
	public List<TacheDTO> getListeTacheByActiviteAndUtilisateur(final Long idActivite,
			final Long idUtilisateur, final Date date) {
		final List<Tache> recup = tacheDAO.getTachesByActiviteAndUtilisateur(idActivite, idUtilisateur, date);
		final List<TacheDTO> output = new ArrayList<TacheDTO>();
		if (!CollectionUtils.isEmpty(recup)) {
			for (final Tache tache : recup) {
				output.add(TacheMapper.entityToDTO(tache, date, null));
			}
		}
		return output;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.service.ITacheService#getListeTacheBySaisieDateAndUtilisateur
	 * (java.lang.Long, java.util.Date)
	 */
	public List<TacheDTO> getListeTacheBySaisieDateAndUtilisateur(final Long idUtilisateur, final Date date) {
		// récupere la liste des taches
		final List<Tache> tacheList = tacheDAO.getTachesBySaisieDateAndUtilisateur(idUtilisateur, date);
		// Convertit et retourne
		return TacheMapper.entityToDTOList(tacheList, null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.service.ITacheService#enregistrerModificationTaches(java
	 * .util.List, java.util.List, java.lang.Long[], java.lang.Long)
	 */
	public void enregistrerModificationTaches(final List<TacheDTO> listeToAdd,
			final List<TacheDTO> tacheToModif, final Long[] tabIdToDelete, final Long idActivite) {

		// Je recupere l'activite concernée par ces modification
		final Activite activite = activiteDAO.read(idActivite);
		// Je modifie les taches
		if (tacheToModif != null)
			modifierTache(activite, tacheToModif);
		// J'ajoute les nouvelles Taches
		if (listeToAdd != null)
			ajouterTache(activite, listeToAdd);
		// Je supprime les taches
		if (tabIdToDelete != null)
			for (final Long idToDelete : tabIdToDelete) {
				tacheDAO.delete(idToDelete);
			}

	}

	/**
	 * Ajoute les taches à l'activite
	 */
	private void ajouterTache(final Activite activite, final List<TacheDTO> listeTacheToAdd) {
		for (final TacheDTO tacheToAdd : listeTacheToAdd) {
			final Tache tache = new Tache();
			tache.setActivite(activite);
			tache.setChargeInit(tacheToAdd.getChargeInit());
			tache.setCommentaire(tacheToAdd.getCommentaire());
			tache.setDateCreation(new Date());
			tache.setDateDebut(new Date());
			tache.setLibelle(tacheToAdd.getLibelle());
			tache.setEtat(etatDAO.read(EtatEnum.CREE.getId()));
			if (tacheToAdd.getUtilisateur().getId() == 0) {
				tache.setUtilisateur(null);
			} else {
				tache.setUtilisateur(utilisateurDAO.read(tacheToAdd.getUtilisateur().getId()));
			}
			tacheDAO.persist(tache);
		}
	}

	/**
	 * Merge les entités dans l'activite
	 * 
	 * @param activite
	 * @param listeToModif
	 */
	private void modifierTache(final Activite activite, final List<TacheDTO> listeToModif) {
		for (final TacheDTO tacheToModif : listeToModif) {
			final Tache tacheRecup = tacheDAO.read(tacheToModif.getId());
			tacheRecup.setLibelle(tacheToModif.getLibelle());
			tacheRecup.setChargeInit(tacheToModif.getChargeInit());
			tacheRecup.setCommentaire(tacheToModif.getCommentaire());
			if (tacheToModif.getUtilisateur().getId() != 0) {
				tacheRecup.setUtilisateur(utilisateurDAO.read(tacheToModif.getUtilisateur().getId()));
			}
			tacheDAO.update(tacheRecup);
		}
	}

}
